#define DEBUG
#include <cstdio>

using namespace std;

typedef long long ll;

const int maxn=200000, maxm=500000;
const ll inf=0x7ffffffffffffff;

ll min(ll a, ll b) {
  return a<b ? a : b;
}

class Graph {
public:
  int n, m, ind[maxn+1], to[2*maxm+1], link[2*maxm+1], val[2*maxm+1];

  void addSide(int u, int v, int w) {
    m++;
    to[m] = v;
    val[m] = w;
    link[m] = ind[u];
    ind[u] = m;
  }

  void calcDis(int s, ll dis[]) {
    static bool book[maxn+1];
    static int que[maxn+1];
    for (int i=1; i<=n; i++) {
      dis[i] = inf;
    }
    dis[s] = 0, que[1] = s, book[s] = true;
    for (int h=0, t=1; h!=t; ) {
      h = h%n+1;
      int x, y;
      book[x=que[h]]=false;
      for (int i=ind[x]; i; i=link[i]) {
	y = to[i];
	if (dis[x]+val[i]<dis[y]) {
	  dis[y] = dis[x]+val[i];
	  if (!book[y]) {
	    book[y] = true;
	    if (h==t || dis[y]>dis[que[h%n+1]]) {
	      t = t%n+1;
	      que[t] = y;
	    } else {
	      que[h] = y;
	      h = (h-2)%n+1;
	    }
	  }
	}
      }
    }
  }
};

int main() {
  freopen("monogatari.in", "r", stdin);
  freopen("monogatari.out", "w", stdout);

  static Graph g;
  int n, m, k;
  scanf("%d %d %d", &n, &m, &k);
  g.n = n;
  for (int i=1; i<m; i++) {
    int u, v, w;
    scanf("%d %d %d", &u, &v, &w);
    g.addSide(u, v, w);
    g.addSide(v, u, w);
  }
  static ll dis[2][maxn+1];
  g.calcDis(1, dis[0]);
  g.calcDis(n, dis[1]);
  int u, v;
  scanf("%d %d", &u, &v);

  for (int i=1; i<=k; i++) {
    int w;
    scanf("%d", &w);
    ll ans=min(min(dis[0][u]+dis[1][v], dis[1][u]+dis[0][v])+w, dis[0][n]);
    if (ans<inf) {
      printf("%lld\n", ans);
    } else {
      printf("+Inf\n");
    }
  }

  fclose(stdin);
  fclose(stdout);
  return 0;
}
